#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>

// 定义一个基本的Shape类，所有图形都将继承自这个类
// 这体现了多范式支持中的面向对象编程（OOP）原则
class Shape {
public:
    virtual void draw() const = 0; // 纯虚函数，要求子类必须实现draw方法
    virtual ~Shape() = default; // 虚析构函数，确保子类的析构过程正确执行
};

// 定义具体的图形类：Circle
class Circle : public Shape {
public:
    static constexpr double radius = 10.0; // 添加constexpr成员，表示半径

    void draw() const override {
        constexpr double area = 3.14159265358979323846 * radius * radius; // 利用编译期常量计算面积,体现零开销原则
        std::cout << "Drawing a Circle with radius: " << radius << " and area: " << area << std::endl;
    }
};

// 定义具体的图形类：Square
class Square : public Shape {
public:
    static constexpr double side_length = 5.0; // 添加constexpr成员，表示边长

    void draw() const override {
        constexpr double area = side_length * side_length; // 计算面积
        std::cout << "Drawing a Square with side length: " << side_length << " and area: " << area << std::endl;
    }
};

// 利用智能指针std::unique_ptr管理图形对象的生命周期
// 这体现了资源管理原则，通过智能指针自动处理资源释放，避免内存泄漏
using GraphicPtr = std::unique_ptr<Shape>;

// 使用STL容器std::vector管理图形集合
// 这展示了如何通过标准库容器提高代码性能和效率
using GraphicCollection = std::vector<GraphicPtr>;

// 支持函数式编程风格的图形遍历和操作
// std::for_each和lambda表达式的使用，展示了C++对多范式编程的支持
void processGraphics(const GraphicCollection& graphics) {
    std::for_each(graphics.begin(), graphics.end(), [](const GraphicPtr& graphic) {
        graphic->draw();
    });
}

int main() {
    GraphicCollection graphics;

    // 创建不同类型的图形，并添加到集合中
    graphics.push_back(std::make_unique<Circle>());
    graphics.push_back(std::make_unique<Square>());

    // 遍历并绘制所有图形
    processGraphics(graphics);

    return 0;
}